"""
统一日志配置
"""

import logging
import logging.handlers
import os
import sys
from typing import Optional
from app.config import get_settings


def setup_logging(
    log_level: Optional[str] = None,
    log_file: Optional[str] = None,
    max_size: Optional[int] = None,
    backup_count: Optional[int] = None
) -> None:
    """
    设置应用日志配置
    
    Args:
        log_level: 日志级别
        log_file: 日志文件路径
        max_size: 日志文件最大大小
        backup_count: 备份文件数量
    """
    settings = get_settings()
    
    # 使用传入参数或配置文件中的值
    level = log_level or settings.log_level
    file_path = log_file or settings.log_file
    max_bytes = max_size or settings.log_max_size
    backup_num = backup_count or settings.log_backup_count
    
    # 确保日志目录存在
    log_dir = os.path.dirname(file_path)
    if log_dir and not os.path.exists(log_dir):
        os.makedirs(log_dir, exist_ok=True)
    
    # 配置根日志器
    root_logger = logging.getLogger()
    root_logger.setLevel(getattr(logging, level.upper()))
    
    # 清除现有的处理器
    for handler in root_logger.handlers[:]:
        root_logger.removeHandler(handler)
    
    # 创建格式化器
    formatter = logging.Formatter(
        fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    
    # 控制台处理器
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setLevel(getattr(logging, level.upper()))
    console_handler.setFormatter(formatter)
    root_logger.addHandler(console_handler)
    
    # 文件处理器（轮转）
    try:
        file_handler = logging.handlers.RotatingFileHandler(
            filename=file_path,
            maxBytes=max_bytes,
            backupCount=backup_num,
            encoding='utf-8'
        )
        file_handler.setLevel(getattr(logging, level.upper()))
        file_handler.setFormatter(formatter)
        root_logger.addHandler(file_handler)
    except Exception as e:
        # 如果文件处理器创建失败，只使用控制台输出
        console_handler.warning(f"无法创建文件日志处理器: {e}")
    
    # 设置第三方库的日志级别
    logging.getLogger("httpx").setLevel(logging.WARNING)
    logging.getLogger("urllib3").setLevel(logging.WARNING)
    logging.getLogger("uvicorn.access").setLevel(logging.INFO)
    
    # 记录日志配置完成
    logger = logging.getLogger(__name__)
    logger.info(f"日志系统初始化完成 - 级别: {level}, 文件: {file_path}")


def get_logger(name: str) -> logging.Logger:
    """
    获取指定名称的日志器
    
    Args:
        name: 日志器名称，通常使用 __name__
        
    Returns:
        配置好的日志器实例
    """
    return logging.getLogger(name)


class LoggerMixin:
    """日志器混入类，为其他类提供日志功能"""
    
    @property
    def logger(self) -> logging.Logger:
        """获取当前类的日志器"""
        return get_logger(self.__class__.__module__ + "." + self.__class__.__name__)


# 应用启动时的日志配置
def configure_app_logging():
    """应用启动时配置日志"""
    try:
        setup_logging()
    except Exception as e:
        # 如果日志配置失败，使用基本配置
        logging.basicConfig(
            level=logging.INFO,
            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
            handlers=[logging.StreamHandler(sys.stdout)]
        )
        logger = logging.getLogger(__name__)
        logger.error(f"日志配置失败，使用基本配置: {e}")


# 自动配置日志（当模块被导入时）
if not logging.getLogger().handlers:
    configure_app_logging()
